package com.frame.util;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Record;

/**
 * @author LRC
 * @createDate 2015年5月27日
 * @description map对象类型数据工具类
 */
public class MapUtil {

	/*******************************************
	 * 功能描述：从前台参数获取参数值放入到模型中
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param model
	 * @param c
	 * @param args
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean copyToModel(Controller c,Model model, String[] args) {
		if (model == null || c == null || args == null)
			return false;
		if(args==null){
			Enumeration<String> names = c.getParaNames();
			while (names.hasMoreElements()) {
				String name = (String) names.nextElement();
				model.set(name, c.getPara(name));
			}
		}
		else{
			try {
				for (int i = 0; i < args.length; i++) {
					String name = args[i];
					String[] ns = name.split(":");
					switch (ns.length) {
					case 1:
						model.set(name, c.getPara(name));
						break;
					case 2:
						model.set(ns[0], c.getPara(ns[1]));
					case 3://拥有类型装换 需要完善
						String type=ns[2];
						model.set(ns[0], c.getPara(ns[1]));
					default:
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return true;
	}

	/*******************************************
	 * 功能描述：从请求控制器（请求对象）中中复制参数到另一个模型对象中
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param c
	 * @param args
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static Record copyToRecord(Controller c,String[] args){
		if(c==null)return null;
		Record rd = new Record();
		if(args==null){
			Enumeration<String> names = c.getParaNames();
			while (names.hasMoreElements()) {
				String name = (String) names.nextElement();
				rd.set(name, c.getPara(name));
			}
		}
		else{
			try {
				for (int i = 0; i < args.length; i++) {
					String name = args[i];
					String[] ns = name.split(":");
					switch (ns.length) {
					case 1:
						rd.set(name, c.getPara(name));
						break;
					case 2:
						rd.set(ns[0], c.getPara(ns[1]));
					case 3://拥有类型装换 需要完善
						String type=ns[2];
						rd.set(ns[0], c.getPara(ns[1]));
					default:
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return rd;
	}
	
	/*******************************************
	 * 功能描述：从模型对象中复制参数到另一个模型对象中
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param model
	 * @param args
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static Record copyToRecord(Model model,String[] args){
		if(model==null||args==null)return null;
		Record rd = new Record();
		try {
			for (int i = 0; i < args.length; i++) {
				String name = args[i];
				String[] ns = name.split(":");
				switch (ns.length) {
				case 1:
					rd.set(name, model.get(name));
					break;
				case 2:
					rd.set(ns[0], model.get(ns[1]));
				default:
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rd;
	}
	
	/*******************************************
	 * 功能描述：数据复制，从JSON对象中复制需要的参数到Record对象
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param model json对象
	 * @param args 需要的参数列表，参数名格式可以是:分开的，如：p:p2，p2作为model中的参数，p作为新的参数名
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static Record copyToRecord(JSONObject model,String[] args){
		if(model==null||args==null)return null;
		Record rd = new Record();
		try {
			for (int i = 0; i < args.length; i++) {
				String name = args[i];
				String[] ns = name.split(":");
				switch (ns.length) {
				case 1:
					rd.set(name, model.get(name));
					break;
				case 2:
					rd.set(ns[0], model.get(ns[1]));
				default:
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rd;
	}
	
	/*******************************************
	 * 功能描述：从JSON对象中复制数据到Model
	 *******************************************
	 * @createDate 2015-9-14 by LRC
	 * @param model
	 * @param targetModel
	 * @param args 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static void copyToModel(JSONObject model,Model targetModel,String[] args){
		if(model==null||args==null)return;
		try {
			for (int i = 0; i < args.length; i++) {
				String name = args[i];
				String[] ns = name.split(":");
				switch (ns.length) {
				case 1:
					targetModel.set(name, model.get(name));
					break;
				case 2:
					targetModel.set(ns[0], model.get(ns[1]));
				default:
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*******************************************
	 * 功能描述：从jfinal查询到的列表提取mpa list
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param list
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static List<Map<String,Object>> getMapListFromRecord(List<Record> list){
		if(list==null)return null;
		List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
		for(Record r : list){
			data.add(r.getColumns());
		}
		return data;
	}
	
	/*******************************************
	 * 功能描述：获取map类型的json字符串
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param list
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static String getJSONString(List<Record> list){
		List<Map<String,Object>> mapList = getMapListFromRecord(list);
		if(mapList!=null){
			return JSONArray.fromObject(mapList).toString();
		}else{
			return "{}";
		}
	}
	
}
